//
// Created by LiuYou on 2021/6/17.
//

#include <cstdlib>
#include <unistd.h>
#include <ctime>
#include <cstdio>
#include <csignal>

// TODO 注意: 定义一个全局变量, 通过这个全局变量来作为我们的标志位。
//  加上static是为了将这个全局变量定义为"局部的", 即本文件作用域内。
//static int loop = 1;
// TODO 注意: 这个 volatile关键字很重要！！！！
//  为 loop 变量加上这个 volatile 这个关键字程序就可以做优化了。
//  gcc AlarmTest03.cpp -o1
// TODO 注意: 做了优化后在我们remote host terminal上运行没有特别大
//  的提升, 但是确实优化提升的一点。之前是2776143370, 使用 -o1后是2791304039。
static volatile int loop = 1;
//static bool loop = true;

static void alarmHandler(int s);


/**
 * @brief 使用信号来实现定时循环
 *
 * 这个版本使用信号。
 *
 * TODO 注意: 这里听不懂慧琴老师在说什么！！！！
 *  以后回头再来看。
 *
 * 经过测试得:
 * AlarmTest02.cpp为 2152719443。

[lucas@VM-0-10-centos Signal]$ g++ AlarmTest02.cpp
[lucas@VM-0-10-centos Signal]$ time ./a.out > /tmp/out

real    0m5.896s
user    0m5.841s
sys     0m0.000s

 * AlarmTest03.cpp为 2779177569。

[lucas@VM-0-10-centos Signal]$ g++ AlarmTest03.cpp
[lucas@VM-0-10-centos Signal]$ time ./a.out > /tmp/out1

real    0m5.002s
user    0m4.939s
sys     0m0.003s

 *
 */
int main() {
    // TODO 注意: signal()函数一定要在main函数的最上方。
    // TODO 注意: alarm()函数和signal()函数是有顺序要求的！！！！！！！！！！！！
    // TODO 注意: signal()函数！一定一定一定！要在alarm()函数之前！！！！！！！！！！！！
    //
    signal(SIGALRM, alarmHandler);
    // TODO 注意: 利用alarm()函数默认功能是实现不了我们想要的功能
    //  因为程序是异常终止的。
    // TODO 注意: 所以我们需要设计一个SIGALRM信号处理函数来实现
    //  我们想要的任务。
    alarm(5);
    int64_t count{};

    while (loop) {
        ++count;
    }
    std::printf("%ld\n", count);


    std::exit(0);
}

static void alarmHandler(int s) {
    loop = 0;
//    loop = false;
}